package simpledb.util;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * IteratorWrapper 是一个 将数组包装成迭代器（Iterator） 的工具类。
 * 实现了 Java 标准库中的 Iterator<T> 接口，可以让我们像使用集合（如 List、Set）一样，对数组进行迭代操作（即支持 hasNext() 和 next() 方法）。
 * 在 SimpleDB 中，为了统一数据访问方式，常常需要将数组（如 Field[]）转换为 Iterator<Field>，从而方便遍历字段等操作。
 * 它将泛型数组 T[] 包装成一个 Iterator<T>，以便于使用标准的迭代器接口进行遍历。
 */
public class IteratorWrapper<T> implements Iterator<T> {

    // 当前迭代的位置索引
    private int currentPos;

    // 被包装的数组对象
    private T[] objects;

    /**
     * 构造函数：将一个泛型数组包装成一个迭代器
     *
     * @param objects 要被包装的数组
     */
    public IteratorWrapper(final T[] objects) {
        this.objects = objects;
        this.currentPos = 0; // 初始化当前索引为 0
    }

    /**
     * 判断是否还有下一个元素可供迭代
     *
     * 注意：不仅检查索引是否越界，还检查当前元素是否为 null。
     * 这意味着如果数组中存在 null 元素，它们会被跳过。
     *
     * @return 如果还有非 null 的元素，则返回 true；否则返回 false
     */
    @Override
    public boolean hasNext() {
        return this.currentPos < this.objects.length && this.objects[this.currentPos] != null;
    }

    /**
     * 返回下一个元素，并将当前索引后移一位
     *
     * @return 下一个元素
     * @throws NoSuchElementException 如果没有更多元素时调用此方法，会抛出异常
     */
    @Override
    public T next() {
        T value = this.objects[this.currentPos]; // 获取当前元素
        this.currentPos++; // 索引递增
        return value;
    }
}
